/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package managedbean;

import com.bean.GestionnaireDeMagasin;
import com.bean.GestionnaireDeUser;
import com.ebay.services.finding.SearchItem;
import com.entities.Produit;
import com.ws.CallEbayWS;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.ejb.EJB;
import javax.enterprise.context.SessionScoped;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.faces.context.Flash;
import javax.inject.Named;
import org.primefaces.model.LazyDataModel;
import org.primefaces.model.SortOrder;

/**
 *
 * @author mathieumiollan
 */
@Named(value = "magasinBean")
@SessionScoped
public class MagasinBean implements Serializable {
    
    private LazyDataModel<Produit>  lazyProduit;
    private LazyDataModel<SearchItem> lazyEbay;
    private String searchebay;
    private List<SearchItem> lstItem;
    private String searchacheteur;
    private String searchvendeur;
    private String searchType;
    
    private String prodTitle;
    private String prodDesc;
    private Double prodPrice;
    private String categorie;
    private String distance;
    
    private Produit produit;
    
    @EJB
    private GestionnaireDeMagasin gestionnaireDeMagasin;
    @EJB
    private GestionnaireDeUser gestionnaireDeUser;
    
    
    
   public String goToCreerProduit(SearchItem item){
       prodTitle = searchebay;
       prodDesc = item.getTitle();
       prodPrice = item.getSellingStatus().getConvertedCurrentPrice().getValue();
       return "creerProduit?faces-redirect=true";
   }
    
    public String btnsrchebay(){
        CallEbayWS ws = new CallEbayWS();
        lstItem = ws.getSearchItem(searchebay);       
        System.out.println("BTNSEARCH " + searchebay);
        
        //searchebay = null;
        
        return "";
    }
    
    public String btnsrchacheteur(){
        searchvendeur = "";
        searchType = "";
        return "";
    }
    
    public String btnsrchvendeur(){
        distance = "";
        categorie = "";
        searchacheteur = "";
        searchType = "Vendeur";
        return "";
    }
    
    public String goToPanier(Produit pdt){
        
        UserBean bean = (UserBean) FacesContext.getCurrentInstance()
                .getApplication()
                .evaluateExpressionGet(FacesContext.getCurrentInstance(), "#{userBean}", UserBean.class);
        gestionnaireDeUser.addProduitPanier(bean.getAcheteurConnecte(), pdt);
        addFlashMessage(new FacesMessage(FacesMessage.SEVERITY_INFO, "Gestion des produits", "Produit ajouté au panier."));
        
        return "panier.xhtml?faces-redirect=true";
    }
    
    public String enleverPanier(Produit pdt){
        UserBean bean = (UserBean) FacesContext.getCurrentInstance()
                .getApplication()
                .evaluateExpressionGet(FacesContext.getCurrentInstance(), "#{userBean}", UserBean.class);
        gestionnaireDeUser.removeProduitPanier(bean.getAcheteurConnecte(), pdt);
        addFlashMessage(new FacesMessage(FacesMessage.SEVERITY_INFO, "Gestion des produits", "Le produit a bien été enlevé du panier."));
        
        return "panier.xhtml?faces-redirect=true";
    }

    public Produit getProduit() {
        return produit;
    }

    public void setProduit(Produit produit) {
        this.produit = produit;
    }
    
    public String btnCreerProduit(){
        
        Produit p = new Produit(prodTitle, prodDesc, BigDecimal.valueOf(prodPrice), categorie);
        
        UserBean bean = (UserBean) FacesContext.getCurrentInstance()
                .getApplication()
                .evaluateExpressionGet(FacesContext.getCurrentInstance(), "#{userBean}", UserBean.class);
        gestionnaireDeMagasin.ajouterProduit(bean.getVendeurConnecte().getMagasin(), p);
        addFlashMessage(new FacesMessage(FacesMessage.SEVERITY_INFO, "Gestion des produits", "Création du produit réussie."));         
        return "listeProduits?faces-redirect=true";
    }
    
    
    public LazyDataModel<SearchItem> getLazyEbay() {
        if (lazyEbay == null) {
            lazyEbay = new LazyDataModel<SearchItem>() {
                
                @Override
                public List<SearchItem> load(int i, int i1, String string, SortOrder so, Map<String, String> map) {
                     //System.out.println("GETLAZYEBAY");
                    
                     if(lstItem != null){
                         if(lstItem.size() > i1){
                             
                             this.setRowCount(lstItem.size());
                             
                            return lstItem.subList(i, i+i1);
                         }
                         else{
                             return lstItem;
                         }
                         
                     }else{
                         return null;
                     }
                    
                    
                    
                    
                    
                }
            };

        }

        
        
        return lazyEbay;
    }

    public void setLazyEbay(LazyDataModel<SearchItem> lazyEbay) {
        this.lazyEbay = lazyEbay;
    }

    public String getSearchebay() {
        return searchebay;
    }

    public void setSearchebay(String searchebay) {
        this.searchebay = searchebay;
    }



    public GestionnaireDeMagasin getGestionnaireDeMagasin() {
        return gestionnaireDeMagasin;
    }

    public void setGestionnaireDeMagasin(GestionnaireDeMagasin gestionnaireDeMagasin) {
        this.gestionnaireDeMagasin = gestionnaireDeMagasin;
    }

    public String getProdDesc() {
        return prodDesc;
    }

    public void setProdDesc(String prodDesc) {
        this.prodDesc = prodDesc;
    }

    public Double getProdPrice() {
        return prodPrice;
    }

    public void setProdPrice(Double prodPrice) {
        this.prodPrice = prodPrice;
    }

    public String getProdTitle() {
        return prodTitle;
    }

    public void setProdTitle(String prodTitle) {
        this.prodTitle = prodTitle;
    }

    public String supprimer(Produit p){
        UserBean bean = (UserBean) FacesContext.getCurrentInstance().getApplication().evaluateExpressionGet(FacesContext.getCurrentInstance(), "#{userBean}", UserBean.class);
        gestionnaireDeMagasin.supprimerProduit(bean.getVendeurConnecte().getMagasin(), p);
        addFlashMessage(new FacesMessage(FacesMessage.SEVERITY_INFO, "Gestion des produits", "Produit supprimé."));
        return "listeProduits?faces-redirect=true";
    }

    public String getCategorie() {
        return categorie;
    }

    public void setCategorie(String categorie) {
        this.categorie = categorie;
    }
    
    
    
    public String modifier(Produit p){
        produit = p;
        return "modifierProduit?faces-redirect=true";
    }
    
    public String btnModifProduit(){
        gestionnaireDeMagasin.modifierProduit(produit);
        addFlashMessage(new FacesMessage(FacesMessage.SEVERITY_INFO, "Gestion des produits", "Modifications enregistrées."));          
        return "listeProduits?faces-redirect=true";
    }

    public String getSearchvendeur() {
        return searchvendeur;
    }

    public void setSearchvendeur(String searchVendeur) {
        this.searchvendeur = searchVendeur;
    }

    public LazyDataModel<Produit> getLazyProduit() {
        if(lazyProduit == null){
            lazyProduit = new LazyDataModel<Produit>() {

                @Override
                public List<Produit> load(int i, int i1, String sortField, SortOrder so, Map<String, String> map) {
                    
                    List<Produit> lst = gestionnaireDeMagasin.getProduitSearch(searchvendeur, searchType, searchacheteur, categorie, distance, i, i1, sortField, so.toString());
                    //System.out.println(lst.size());
                    if(distance == null){
                        this.setPageSize(i1);
                        this.setRowCount(lst.size());
                        return lst;
                    
                    }
                    else{
                        System.out.println("DISTANCE VALUE NOT NULL " + distance);
                    }
                    UserBean bean = (UserBean) FacesContext.getCurrentInstance().getApplication().evaluateExpressionGet(FacesContext.getCurrentInstance(), "#{userBean}", UserBean.class);
                    List<Produit> retLst = new ArrayList<Produit>();
                    // hashmap Ville / affiche(true)
                    HashMap<String, Boolean> mapVille = new HashMap<String, Boolean>();
                    
                    for(Produit p : lst){
                        if(!mapVille.containsKey(p.getMagasin().getProprio().getAdresse())){ // ville inconuu
                            double dist = bean.getDistanceFromVendeur(p.getMagasin().getProprio().getAdresse(), bean.getAcheteurConnecte().getAdresse());
                            
                            if("proche".equals(distance)){
                                
                            }else if("15".equals(distance)){
                                System.out.println(dist);
                                if(dist > 15){
                                    mapVille.put(p.getMagasin().getProprio().getAdresse(), Boolean.FALSE);
                                    
                                }
                                else{
                                    retLst.add(p);
                                    mapVille.put(p.getMagasin().getProprio().getAdresse(), Boolean.TRUE);
                                }
                            }else{ // distance jusqu'a 30 bornes
                                if(dist > 30){
                                    
                                    mapVille.put(p.getMagasin().getProprio().getAdresse(), Boolean.FALSE);
                                }
                                else{
                                    retLst.add(p);
                                    mapVille.put(p.getMagasin().getProprio().getAdresse(), Boolean.TRUE);
                                }
                                
                            }
                            
                            
                        }else{ // ville deja connu
                            if(mapVille.get(p.getMagasin().getProprio().getAdresse())){ // true = affiche
                                retLst.add(p);
                            }
                            
                        }
                        
                    }
                            
                            
                    
                    
                    this.setPageSize(i1);
                    this.setRowCount(retLst.size());
                    return retLst;
                    
                }
            };
                    return lazyProduit;
        }else{
            return lazyProduit;
        }
    }

    public void setLazyProduit(LazyDataModel<Produit> lazyProduit) {
        this.lazyProduit = lazyProduit;
    }

    public String getSearchacheteur() {
        return searchacheteur;
    }

    public void setSearchacheteur(String searchacheteur) {
        this.searchacheteur = searchacheteur;
    }

    public String getDistance() {
        return distance;
    }

    public void setDistance(String distance) {
        this.distance = distance;
    }
    private void addFlashMessage(FacesMessage message) {
        FacesContext facesContext = FacesContext.getCurrentInstance();
        Flash flash = facesContext.getExternalContext().getFlash();
        flash.setKeepMessages(true);
        flash.setRedirect(true);
        facesContext.addMessage(null, message);
    }
}

